package operation;

import book.Book;
import book.BookList;

import java.util.Arrays;

//新增图书，新增的是Book类型的对象
public class AddBook implements IOperation,IScanner {
    //判断书架是否满了
    private boolean isFull(BookList books){
        return books.getBooks().length==books.getUsedSize();//books书架里的books数组的长度是否等于books数组已经存放的书本的数量
    }
    public void work(BookList books) {
        System.out.println("新增图书————");
        System.out.println("请输入您要新增的书籍名称：");
        String name=scannerName();
        System.out.println("请输入您要新增的书籍作者：");
        String author=scannerAuthor();
        System.out.println("请输入您要新增的书籍价格：");
        double price=scannerPrice();
        scannerName();//吸收回车
        System.out.println("请输入您要新增的书籍类型：");
        String type=scanneType();

        /*if(isFull(books)){//为true，已满，需扩容
            books.getBooks() = Arrays.copyOf(books.getBooks(), books.getUsedSize()*2);
        }*/
        if(isFull(books)){//为true，已满，需扩容
            Book[] oldBook=books.getBooks();
            Book[] newBook=Arrays.copyOf(oldBook, books.getUsedSize()*2);
            books.setBooks(newBook);
        }
        Book book=new Book(name,author,price,type);
        //（假设书架上每种书只有一本）如果书架上有book这本书了则不能上架--用FindBook去查一下或者遍历整个书架
        FindBook findBook=new FindBook();
        if(!findBook.work(book)){//书架上没有这本书则add
            books.setBook(books.getUsedSize(), book);
            books.setUsedSize( books.getUsedSize()+1);
            System.out.println("新增成功");
        }else{//书架上有这本书了
            System.out.println("书架上已有这本书，无需添加");
        }
    }
}
/*
在Java中，数组一旦创建，其长度就是固定的，无法直接对其进行扩容。不过，可以通过创建一个新的更大的数组，并将原数组的元素复制到新数组的方式来实现类似扩容的效果。以下是几种常见的方法：

使用 System.arraycopy 方法
System.arraycopy 是一个本地方法，用于将一个数组中的元素复制到另一个数组中。

java

复制
public class ArrayResizeExample {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3};
        int newSize = 5;

        int[] newArray = new int[newSize];
        System.arraycopy(originalArray, 0, newArray, 0, originalArray.length);

        // 打印新数组
        for (int num : newArray) {
            System.out.print(num + " ");
        }
    }
}
使用 Arrays.copyOf 方法
Arrays.copyOf 是Java标准库中提供的方法，它会创建一个新数组，并将原数组的元素复制到新数组中。如果新数组长度大于原数组长度，会用默认值填充新数组剩余的位置。

java

复制
import java.util.Arrays;

public class ArrayResizeExample {
    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3};
        int newSize = 5;

        int[] newArray = Arrays.copyOf(originalArray, newSize);

        // 打印新数组
        for (int num : newArray) {
            System.out.print(num + " ");
        }
    }
}
使用 ArrayList 类（适用于对象数组）
如果是对象数组，ArrayList 类提供了更灵活的动态扩容方式。ArrayList 内部维护一个数组，并在需要时自动扩容。

java

复制
import java.util.ArrayList;
import java.util.List;

public class ArrayListResizeExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // 可以随时添加元素，ArrayList会自动扩容
        list.add("cherry");

        // 将 ArrayList 转换为数组
        String[] newArray = list.toArray(new String[0]);

        // 打印新数组
        for (String str : newArray) {
            System.out.print(str + " ");
        }
    }
}
自定义方法实现扩容（以基本数据类型数组为例）
java

复制
public class CustomArrayResize {
    public static int[] resizeArray(int[] originalArray, int newSize) {
        int[] newArray = new int[newSize];
        for (int i = 0; i < originalArray.length; i++) {
            newArray[i] = originalArray[i];
        }
        return newArray;
    }

    public static void main(String[] args) {
        int[] originalArray = {1, 2, 3};
        int newSize = 5;

        int[] newArray = resizeArray(originalArray, newSize);

        for (int num : newArray) {
            System.out.print(num + " ");
        }
    }
}
在这些方法中，System.arraycopy 和 Arrays.copyOf 相对底层和高效，适合对性能要求较高的场景；而 ArrayList 更适合需要频繁动态添加和删除元素的场景，因为它提供了更丰富的操作方法。自定义方法则可以根据具体需求灵活调整实现细节。
 */